package com.shishuo.cdn.action;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.shishuo.cdn.dao.PayCodeDao;
import com.shishuo.cdn.dao.UserBankLogDao;
import com.shishuo.cdn.dao.UserDao;
import com.shishuo.cdn.dao.VoucherDao;
import com.shishuo.cdn.entity.User;
import com.shishuo.cdn.entity.vo.JsonVo;
import com.shishuo.cdn.util.CommonUtil;

/**   
* 描述：充值，支付，转账，退款，消费明细 管理   
* 创建人：YangJ  邮箱:yangjie@sxw100.com   
* 创建时间：2015年6月25日 下午4:43:40   
* 修改备注：   
* @version    
*    
*/ 
@Controller
@RequestMapping(value="/voucher")
public class VoucherAction extends BaseAction {
	private static final int DEFAULT_COUNT_ONEPAGE=5;//默认每页显示条数
	@Autowired
	private UserDao userDao;
	@Autowired
	private VoucherDao voucherDao;
	@Autowired
	private UserBankLogDao userBankLogDao;
	@Autowired
	private PayCodeDao payCodeDao;
	/*----------------------------------------------------------视图部分-开始----------------------------------------------------------------------------------*/
	
	@RequestMapping(value="/forMyselfView.htm")
	public String forMyselfView(HttpServletRequest request,ModelMap modelMap){
//		createParameterMap(request);
//		modelMap.putAll(paramsMap);
		refreshSessionUser(request);//刷新session里的user 拿到最新余额
		createParameterMap(request);
		int pageNo=paramsMap.get("pageNo")!=null?Integer.valueOf(paramsMap.get("pageNo").toString()):1;
		createParameterMap(request);
//		-------分页查询
		pageNo=pageNo<1?1:pageNo;//页码当前为1
//		pageNo=paramsMap.get("pageNo")!=null?Integer.valueOf(paramsMap.get("pageNo").toString()) :1;//第几页
		if("".equals(paramsMap.get("bank_type")))paramsMap.remove("bank_type");//""查询全部
		if("".equals(paramsMap.get("start_date")))paramsMap.remove("start_date");//
		if("".equals(paramsMap.get("end_date")))paramsMap.remove("end_date");//
		
		paramsMap.put("status", 1);//已完成的交易
		int totalCount=userBankLogDao.queryuserBankLogCount(paramsMap);//数据总数
		//总页数
		int pages=totalCount%DEFAULT_COUNT_ONEPAGE==0?totalCount/DEFAULT_COUNT_ONEPAGE:totalCount/DEFAULT_COUNT_ONEPAGE+1;
//		if(pageNo<1) pageNo=1;
		if(pageNo>pages) pageNo=pages;
		int offset=(pageNo-1)*DEFAULT_COUNT_ONEPAGE;//偏移量
		
		if(offset<0)offset=0;
		paramsMap.put("offset", offset);
		paramsMap.put("rows", DEFAULT_COUNT_ONEPAGE);
		
		
		List<Map<String,Object>> list=userBankLogDao.queryuserBankLog(paramsMap);
		paramsMap.put("dataList", list);
		modelMap.putAll(paramsMap);
		modelMap.put("pages",pages);//总页数
		modelMap.put("totalCount", totalCount);//总条数
		modelMap.put("pageNo", pageNo);//当前页号
		
		
		modelMap.put("pageType", "我的钱包");
		return "/business/forMyselfView";//为自己充值界面
	}
	
	@RequestMapping(value="/forOthersView.htm")
	public String forOtherView(HttpServletRequest request,ModelMap modelMap){
//		modelMap.put("othersName", othersName);
//		createParameterMap(request);
//		modelMap.putAll(paramsMap);
		modelMap.put("pageType", "为其他账号充值");
		
		
		return "/business/forOthersView";//为别人充值界面
	}
	
	@RequestMapping(value="/forTransferAccounts.htm")
	public String forTransferAccounts(HttpServletRequest request,ModelMap modelMap){
		createParameterMap(request);
		modelMap.putAll(paramsMap);
		modelMap.put("pageType", "转账");
		return "/business/transferAccounts";//转账界面
	}
	
	@RequestMapping(value="/forRefundMoney.htm")
	public String forRefundMoney(HttpServletRequest request,ModelMap modelMap){
		createParameterMap(request);
		int pageNo=paramsMap.get("pageNo")!=null?Integer.valueOf(paramsMap.get("pageNo").toString()):1;
//		-------分页查询
		pageNo=pageNo<1?1:pageNo;//页码当前为1
		paramsMap.put("bank_type", 4);//4:退款申请
		if("".equals(paramsMap.get("status")))paramsMap.remove("status");//""查询全部
		if("".equals(paramsMap.get("start_date")))paramsMap.remove("start_date");//
		if("".equals(paramsMap.get("end_date")))paramsMap.remove("end_date");//
		
		int totalCount=userBankLogDao.queryuserBankLogCount(paramsMap);//数据总数
		//总页数
		int pages=totalCount%DEFAULT_COUNT_ONEPAGE==0?totalCount/DEFAULT_COUNT_ONEPAGE:totalCount/DEFAULT_COUNT_ONEPAGE+1;
		if(pageNo>pages) pageNo=pages;
		int offset=(pageNo-1)*DEFAULT_COUNT_ONEPAGE;//偏移量
		if(offset<0)offset=0;
		paramsMap.put("offset", offset);
		paramsMap.put("rows", DEFAULT_COUNT_ONEPAGE);
		
		
		List<Map<String,Object>> list=userBankLogDao.queryuserBankLog(paramsMap);//type=4 退款申请
		paramsMap.put("dataList", list);
		modelMap.putAll(paramsMap);
		modelMap.put("banKCardInfo", voucherDao.queryUserBankCardByUserId(paramsMap.get("user_id").toString()));//总页数
		modelMap.put("pages", pages);//总页数
		modelMap.put("totalCount", totalCount);//总条数
		modelMap.put("pageNo", pageNo);//当前页号
		modelMap.put("pageType", "退款申请");
		return "/business/refundMoney";//退款申请界面(带分页数据)
	}
	
	@RequestMapping(value="/forPaydetail.htm")
	public  String forPaydetail(HttpServletRequest request,ModelMap modelMap){
		createParameterMap(request);
		int pageNo=paramsMap.get("pageNo")!=null?Integer.valueOf(paramsMap.get("pageNo").toString()):1;
		createParameterMap(request);
//		-------分页查询
		pageNo=pageNo<1?1:pageNo;//页码当前为1
//		pageNo=paramsMap.get("pageNo")!=null?Integer.valueOf(paramsMap.get("pageNo").toString()) :1;//第几页
		if("".equals(paramsMap.get("bank_type")))paramsMap.remove("bank_type");//""查询全部
		if("".equals(paramsMap.get("start_date")))paramsMap.remove("start_date");//
		if("".equals(paramsMap.get("end_date")))paramsMap.remove("end_date");//
		
		paramsMap.put("status", 1);//已完成的交易
		int totalCount=userBankLogDao.queryuserBankLogCount(paramsMap);//数据总数
		//总页数
		int pages=totalCount%DEFAULT_COUNT_ONEPAGE==0?totalCount/DEFAULT_COUNT_ONEPAGE:totalCount/DEFAULT_COUNT_ONEPAGE+1;
//		if(pageNo<1) pageNo=1;
		if(pageNo>pages) pageNo=pages;
		int offset=(pageNo-1)*DEFAULT_COUNT_ONEPAGE;//偏移量
		
		if(offset<0)offset=0;
		paramsMap.put("offset", offset);
		paramsMap.put("rows", DEFAULT_COUNT_ONEPAGE);
		
		
		List<Map<String,Object>> list=userBankLogDao.queryuserBankLog(paramsMap);
		paramsMap.put("dataList", list);
		modelMap.putAll(paramsMap);
		modelMap.put("pages",pages);//总页数
		modelMap.put("totalCount", totalCount);//总条数
		modelMap.put("pageNo", pageNo);//当前页号
		modelMap.put("pageType", "消费明细");
	return "/business/paydetail";	//消费明细界面 要做分页
	}
	/*----------------------------------------------------------视图部分-结束----------------------------------------------------------------------------------*/
	/**   
	* 描述：为自己充值   
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年6月25日 下午4:47:22   
	* 修改备注：   
	* @version    
	*    
	*/ 
	@ResponseBody
	@RequestMapping(value="/forMyself.json")
	public JsonVo forMyself(HttpServletRequest request){
		createParameterMap(request);//获取参数
		if(paramsMap.get("reg_tel")==null){
		User user=(User)(request.getSession().getAttribute("user"));
		user=userDao.getUserById(String.valueOf(user.getUser_id()));//重新拿user 拿到最新余额
		paramsMap.put("user_id", user.getUser_id());
		}
//		else{
			List<Map<String,Object>> list=userDao.queryUserByCondition(paramsMap);
			if(list!=null && !list.isEmpty())
				paramsMap.put("user_id", list.get(0).get("user_id"));
			else
			{
				json.setMsg("指定帐号不存在！");
			}
//		}
		paramsMap.put("type","1");//type=1 给自己充值
		
		paramsMap.put("order_sn", CommonUtil.CreatOrderId());
		paramsMap.put("create_time",new Date());
		paramsMap.put("description","账户充值");
		paramsMap.put("status","0");
		
		paramsMap.put("kf_refund","0");//默认数据
		paramsMap.put("cw_refund","0");
		paramsMap.put("gl_name","");
		
		int payway=(Integer.valueOf(paramsMap.get("pay_way").toString()));//支付方式
//		paramsMap.put(key, value)
//		userBankLogDao.modifyUserBankLog(paramsMap);
		switch(payway){//写死：1：支付宝 2：银联 3：支付码
		case 1:
			userBankLogDao.addUserBankLog(paramsMap);//创建订单
			json.setT(request.getContextPath()+"/pay/alipayapi.htm?type=1");//type=1:为自己充值
			break;
		case 2:
			userBankLogDao.addUserBankLog(paramsMap);//创建订单
			json.setT(request.getContextPath()+"/pay/unionpay.htm?type=1");
			break;
		case 3:
			List<Map<String, Object>> resultList=payCodeDao.queryPayCode(paramsMap);
			if(resultList.size()==0)
				{json.setMsg("无效支付码");
				return json;}

			else
			{
				//当前用户
				User user=userDao.getUserById(((User)request.getSession().getAttribute("user")).getReg_tel());
				//当前字符码
				Map<String, Object> payCodeMap = resultList.get(0);
				if(!user.getReg_tel().equals(payCodeMap.get("account")))
				{
					json.setMsg("支付码与当前用户不匹配！");
					return json;
				}
				
				paramsMap.put("bank_money", payCodeMap.get("pay_money"));//订单完成
				payCodeMap.put("status",2);//支付码已用
				paramsMap.put("status", 1);//订单完成
				payCodeDao.modifyPageCode(payCodeMap);
				
				userBankLogDao.addUserBankLog(paramsMap);//创建订单
				
				user.setBalance(new BigDecimal(Double.valueOf(user.getBalance().toString())+Double.valueOf(paramsMap.get("bank_money").toString())));	
				paramsMap.clear();
				paramsMap.put("reg_tel", user.getReg_tel());//用户电话
				paramsMap.put("balance", user.getBalance());//最新金额
				userDao.modifyUserInfo(paramsMap);
				
			}//支付码业务逻辑
				break;
		}
		
		json.setResult(true);
		json.setMsg("充值成功");
		return json;

//		return "/alipay/alipayapi";
	}
	
	/**   
	 * 描述：为他人充值   
	 * 创建人：YangJ  邮箱:yangjie@sxw100.com   
	 * 创建时间：2015年6月25日 下午4:47:22   
	 * 修改备注：   
	 * @version    
	 *    
	 */ 
	@ResponseBody
	@RequestMapping(value="/forOthers.json")
	public JsonVo forOthers(HttpServletRequest request){
//		return forMyself(request);
		createParameterMap(request);//获取参数
//		User user=null;
//		if(paramsMap.get("reg_tel")==null){
//		 user=(User)(request.getSession().getAttribute("user"));
////		user=userDao.getUserById(String.valueOf(user.getUserId()));//重新拿user 拿到最新余额
//		paramsMap.put("user_id", user.getUser_id());
//		}
//		else{
//			List<Map<String,Object>> list=userDao.queryUserByCondition(paramsMap);
//			if(list!=null && !list.isEmpty())
//				paramsMap.put("user_id", list.get(0).get("user_id"));
//			else
//			{
//				json.setMsg("指定帐号不存在！");
//			}
//		}
		paramsMap.put("type","2");//type=2 给别人充值
		
		paramsMap.put("order_sn", CommonUtil.CreatOrderId());
		paramsMap.put("create_time",new Date());
		paramsMap.put("description","给别人账户充值");
		paramsMap.put("status","0");
		paramsMap.put("to_user_id",paramsMap.get("reg_tel"));//给别人充值 的《帐号》不写user id了 只写手机号
		
		paramsMap.put("kf_refund","0");//默认数据
		paramsMap.put("cw_refund","0");
		paramsMap.put("gl_name","");
		int orderId=userBankLogDao.addUserBankLog(paramsMap);//创建订单
		int payway=(Integer.valueOf(paramsMap.get("pay_way").toString()));//支付方式
//		paramsMap.put(key, value)
//		userBankLogDao.modifyUserBankLog(paramsMap);
		switch(payway){//写死：1：支付宝 2：银联 
		case 1:
			json.setT(request.getContextPath()+"/pay/alipayapi.htm?bank_type=2");//type=2:为别人充值
			break;
		case 2:
			json.setT(request.getContextPath()+"/pay/unionpay.htm?bank_type=2");
			break;
//		case 3:
//			List<Map<String, Object>> resultList=payCodeDao.queryPayCode(paramsMap);
//			if(resultList.size()==0)
//				json.setMsg("无效支付码");
//			else
//			{}//支付码业务逻辑
//				break;
		}
		json.setResult(true);
		return json;
	}
	

	
	/**   
	* 描述：   转账
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年6月26日 下午4:23:25   
	* 修改备注：   
	* @version    
	*    
	*/ 
	@ResponseBody
	@RequestMapping(value="/transferAccounts.json")
	public JsonVo transferAccounts(HttpServletRequest request){
		createParameterMap(request);
		Map<String,Object> tempMap=new HashMap<String,Object>();
		tempMap.put("reg_tel", paramsMap.get("reg_tel"));
		List<Map<String,Object>> listuser=userDao.queryUserByCondition(tempMap);
		if(listuser==null || listuser.isEmpty())
			json.setMsg("未找到该用户！");
		else if(listuser.get(0).get("nick_name").equals(((User)request.getSession().getAttribute("user")).getNick_name()))
			json.setMsg("不能给自己转账！");
		else{
			User transferHuman=(User)request.getSession().getAttribute("user");
			Map<String,Object> receiveUserMap=listuser.get(0);
			double balance=Double.valueOf(transferHuman.getBalance().toString());
			double pay=Double.valueOf(paramsMap.get("money").toString());
			if(balance < pay)
				json.setMsg("余额不足！");
			else
			{
				Map<String,Object> temp=new HashMap<String,Object>();
				transferHuman.setBalance(BigDecimal.valueOf(balance-pay));//rq 2015.07.29
				temp.put("user_id", transferHuman.getUser_id());
				temp.put("balance", balance-pay);
				userDao.modifyUserInfo(temp);//先减
				receiveUserMap.put("balance",Double.valueOf( receiveUserMap.get("balance").toString())+pay);
				userDao.modifyUserInfo(receiveUserMap);//再加
				//------------------------------------
				paramsMap.put("type","3");//type=3 转账
				paramsMap.put("bank_money",pay);//type=2 给别人充值
				
				paramsMap.put("order_sn", CommonUtil.CreatOrderId());
				paramsMap.put("create_time",new Date());
				paramsMap.put("description","转账");
				paramsMap.put("status","1");//即时生效
				paramsMap.put("to_user_id",paramsMap.get("reg_tel"));//给别人充值 的《帐号》不写user id了 只写手机号
				
				paramsMap.put("kf_refund","0");//默认数据
				paramsMap.put("cw_refund","0");
				paramsMap.put("gl_name","");
				//---------------------------------
				userBankLogDao.addUserBankLog(paramsMap);//增加订单
				json.setResult(true);
			}
		}
		return json;
	}
	
	/**   
	* 描述：   保存退款信息
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年6月26日 下午5:38:30   
	* 修改备注：   
	* @version    
	*    
	*/ 
	@ResponseBody
	@RequestMapping(value="/addRefundInfo.json")
	public JsonVo addRefundInfo(
			HttpServletRequest request
			){
		createParameterMap(request);
		paramsMap.put("type", 4);//type=4 退款申请
		paramsMap.put("description", "退款申请"); 
		paramsMap.put("create_time", new Date()); 
		paramsMap.put("status", 0); 
		paramsMap.put("order_sn", CommonUtil.CreatOrderId());
		
		paramsMap.put("kf_refund","0");//默认数据
		paramsMap.put("cw_refund","0");
		paramsMap.put("gl_name","");
		
		if("-1".equals(paramsMap.get("pay_way")))//退款到支付宝
			paramsMap.put("card_number", paramsMap.get("zfb_number"));//用银行卡号的字段存放支付宝帐号
		userBankLogDao.addUserBankLog(paramsMap);
		json.setResult(true);
		return json;
	}
	/**   
	* 描述：   撤销退款申请
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年7月28日 下午5:42:03   
	* 修改备注：   
	* @version    
	*    
	*/ 
	@ResponseBody
	@RequestMapping(value="/revokeRefundApply.json")
	public JsonVo revokeRefundApply(
			HttpServletRequest request
			){
		createParameterMap(request);
		userBankLogDao.modifyUserBankLog(paramsMap);//status=2:用户撤销
		json.setResult(true);
		return json;
	}
	/**   
	* 描述：   查询单条退款明细
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年7月28日 下午5:26:19   
	* 修改备注：   
	* @version    
	*    
	*/ 
	@ResponseBody
	@RequestMapping(value="/queryRefundDetail.json")
	public JsonVo queryRefundDetail(
			HttpServletRequest request
			){
		createParameterMap(request);
	Map<String,Object> detail=userBankLogDao.queryuserBankLog(paramsMap).get(0);
	json.setT(detail);
	json.setResult(true);
		return json;
	}
	/**   
	* 描述：  查询消费明细（4种分类）
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年8月6日 11:18:45   
	* 修改备注：   
	* @version    
	*    
	*/ 
	@ResponseBody
	@RequestMapping("/queryPayDetail.json")
	public JsonVo queryPaydetail(HttpServletRequest request){
		createParameterMap(request);
//		String id=paramsMap.get("id").toString();
		List<Map<String,Object>> payLogList=userBankLogDao.queryuserBankLog(paramsMap);
		if(payLogList==null || payLogList.size()<1)
			{
			json.setMsg("未找到该条消费日志！");
			return json;
			}
		
		Map<String,Object> payLogMap=payLogList.get(0);
		int type=(Integer.valueOf(payLogMap.get("type").toString()));//支付方式
		switch(type)
		{
		case 1://自己充值
			payLogMap.put("be_recharge_accounts", ((User)paramsMap.get("userObj")).getReg_tel());
			payLogMap.put("recharge_accounts", payLogMap.get("card_number"));
			break;
		case 2://为其他帐号充值
			payLogMap.put("be_recharge_accounts", payLogMap.get("to_user_id"));
			payLogMap.put("recharge_accounts", payLogMap.get("card_number"));
			break;
		case 3://转账
			
			break;
		}
		json.setT(payLogMap);
		json.setResult(true);
		return json;
	}
	/**   
	* 描述：   给他人转款：返回 公司或人名
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年7月28日 下午5:36:43   
	* 修改备注：   
	* @version    
	*    
	*/ 
	@ResponseBody
	@RequestMapping(value="/checkUser.json")
	public JsonVo checkUser(HttpServletRequest request){
//		json=json;
//		json.setMsg("");
//		json.setResult(false);
		createParameterMap(request);
		List<Map<String,Object>>userList=userDao.queryUserByCondition(paramsMap);
		if(userList.size()>0){
			Map<String,Object> user=userList.get(0);
			json.setResult(true);
			json.setT(String.valueOf((user.get("company")!=null&&!"".equals(user.get("company"))?user.get("company"):user.get("real_name"))));
		}
		return json;
	}
}
